package com.udaos.modules.company.services;

import java.util.ArrayList;
import java.util.List;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;

import com.udaos.common.base.AppException;
import com.udaos.common.base.Service;
import com.udaos.models.company.Ud_company;
import com.udaos.models.company.Ud_company_region;
import com.udaos.models.region.Ud_region;
import com.udaos.models.school.Ud_school;
import com.udaos.models.sys.Sys_user;
import com.udaos.modules.region.services.UdRegionService;
import com.udaos.modules.school.services.UdSchoolService;

/**
 * 主体Service
 * 
 * @author mutaotao
 * @time 2016-11-07 17:19:18
 * 
 */
@IocBean(args = { "refer:dao" })
public class UdCompanyRegionService extends Service<Ud_company_region> {

	@Inject
	private UdRegionService regionService;
	@Inject
	private UdSchoolService schoolService;
	@Inject
	private UdCompanyService companyService;

	public UdCompanyRegionService(Dao dao) {
		super(dao);
	}

	/**
	 * 根据主体ID获取主体-片区
	 * 
	 * @param company_id
	 *            主体ID
	 * @return
	 */
	public List<Ud_company_region> findById(String company_id) {
		// 获取主体
		Cnd cnd = Cnd.NEW();
		cnd.and("delFlag", "=", "0");
		cnd.and("company_id", "=", company_id);
		cnd.desc("createAt");
		return dao().query(Ud_company_region.class, cnd);
	}

	/**
	 * 根据主体ID获取其开通的片区
	 * 
	 * @param company_id
	 *            主体ID
	 * @return
	 */
	public List<Ud_region> findRegionById(String company_id) {
		// 获取主体
		List<Ud_company_region> list = this.findById(company_id);
		List<Ud_region> rlist = new ArrayList<Ud_region>();
		if (null != list) {
			for (Ud_company_region cr : list) {
				Ud_region region = regionService.fetch(cr.getRegion_id());
				rlist.add(region);
			}
		}
		return rlist;
	}

	/**
	 * 根据主体，片区获取该片区下的默认驾校
	 * 
	 * @param region_id
	 * @param company_id
	 * @return
	 */
	public Ud_school getDefaultSchool(String region_id, String company_id) {
		if (!Strings.isBlank(region_id) && !Strings.isBlank(company_id)) {
			Cnd cnd = Cnd.NEW();
			cnd.and("region_id", "=", region_id);
			cnd.and("company_id", "=", company_id);
			Ud_company_region company_region = this.fetch(cnd);
			if (null != company_region) {
				return schoolService.fetch(company_region.getDefault_school());
			} else {
				return null;
			}
		} else {
			return null;
		}
	}

	/**
	 * 判断主体是否已经开通片区
	 * 
	 * @param region_id
	 *            片区ID
	 * @param company_id
	 *            主体ID
	 * @return
	 */
	public boolean isHave(String region_id, String company_id) {
		Cnd cnd = Cnd.NEW();
		cnd.and("region_id", "=", region_id);
		cnd.and("company_id", "=", company_id);
		cnd.and("delFlag", "=", "0");
		List<Ud_company_region> list = this.query(cnd);
		if (null != list && list.size() > 0) {
			return true;
		}
		return false;

	}

	/**
	 * 新增
	 * 
	 * @param company_region
	 * @throws AppException
	 */
	@Aop(TransAop.READ_COMMITTED)
	public void save(Ud_company_region company_region) throws AppException {
		// 判断是否已经开通
		if (isHave(company_region.getRegion_id(), company_region.getCompany_id())) {
			throw new AppException("该片区已经开通，请勿再次开通");
		} else {
			// 保存数据
			// 设置创建时间
			company_region.setCreateAt((int) (System.currentTimeMillis() / 1000));
			// 设置创建人
			Subject subject = SecurityUtils.getSubject();
			Sys_user user = (Sys_user) subject.getPrincipal();
			company_region.setCreateBy(user.getId());
			dao().insert(company_region);
		}
	}
	/**
	 * 修改
	 * 
	 * @param company_region
	 * @throws AppException
	 */
	@Aop(TransAop.READ_COMMITTED)
	public void updateCr(Ud_company_region company_region) throws AppException {
		// 判断是否已经开通
		if (isHave(company_region.getRegion_id(), company_region.getCompany_id())) {
			throw new AppException("该片区已经开通，请勿再次开通");
		} else {
			// 设置创建时间
			company_region.setOpAt((int)(System.currentTimeMillis()/1000));
			dao().updateIgnoreNull(company_region);
		}

	}

	
	/**
	 * 获取所有片区
	 * 
	 * @return
	 */
	public List<Ud_region> findRegions() {
		return regionService.find();
	}

	/**
	 * 获取所有主体
	 * 
	 * @return
	 */
	public Object findCompanys() {
		return companyService.find();
	}

	public NutMap init(int length, int start, int draw) {
		String sqls="SELECT cr.id AS id ,c.name AS company_name ,g.name AS region_name ,s.name AS school_name "
					+" FROM ud_company_region cr INNER JOIN ud_company c ON cr.company_id= c.id INNER JOIN  ud_region g ON cr.region_id = g.id LEFT JOIN ud_school s ON cr.default_school = s.id "
					+" WHERE  cr.delFlag=FALSE";
		Sql sql =Sqls.create(sqls);
		return this.data(length, start, draw, sql, sql);
	}
}